/* 树的数组表示、后序遍历。
二叉树各节点有ID（从0起）、有权值（整数）。
设想除根节点外、以其他任一节点x为根从原二叉树脱离，会得到一棵新树Tx、一棵余树Tr。
  两树节点权值和分别为Sx, Sr。
  两树权值和之差的绝对值Dx = |Sx - Sr|
求最大Dx对应的节点ID（如有多个相同的最大差，取最小的ID）。
数据首行为节点个数N（2~10000）
第2为N个节点值（可有负数）
第3行起每行两个整数，分别是父、子节点ID，且出现过左子节点后才会有右子节点。
直到EOF为止。
示例：
4
4 9 -7 -8
0 1
0 3
1 2
结果：
3
*/
#include <climits>
#include <iostream>
using namespace std;

const int N = 10000; // 按上限开数组
long total = 0, md = -1, id = LONG_MAX; // 树总和、最大差、对应节点ID
long vv[N], vl[N], vr[N]; // 权值、左子索引、右子索引
// 第i个节点的左子节点索引是vl[i]，为0表示无子节点。

long post_sum(int i){ // 后序遍历求子树和、计算树差绝对值并对比
  long s = vv[i];
  if(vl[i]){ s += post_sum(vl[i]); } // 处理左子树
  if(vr[i]){ s += post_sum(vr[i]); } // 处理右子树
  long d = abs(s - (total - s)); // 子树和s 与 剩余树和(total - s) 的差
  if(i && (md < d || (md == d && id > i))){ // 非根且（差更大 或 差等大但ID小）
    md = d;
    id = i;
  }
  return s;
}

int main(){
  int n;
  cin >> n;
  for(int i = 0; i < n; ++i){
    cin >> vv[i]; // 读入权值
    total += vv[i]; // 顺路求树总和
  }
  for(int p, c; cin >> p >> c;){ // 建树：读入父ID、子ID
    (vl[p] ? vr : vl)[p] = c; // 左子ID如已设，则连接右子树
  }
  post_sum(0);
  cout << id << endl;
}
